#include <iostream>
#include <vector>
#include <cassert>

using namespace std;
// 54.螺旋矩阵
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size();      // 行数
        assert(m > 0);
        int n = matrix[0].size();   // 列数
        assert(n > 0);

        int l = 0, r = n-1, t = 0, b = m-1; // 左，右，上，下边界
        vector<int> ans;
        while(true) {
            for(int i = l; i <= r; i++)     // 从左向右
                ans.push_back(matrix[t][i]);    // 第t行的第i列
            if(++t > b) break;
            for(int i = t; i <= b; i++)      // 从上向下
                ans.push_back(matrix[i][r]);
            if(--r < l) break;
            for(int i = r; i >= l; i--)     // 从右向左
                ans.push_back(matrix[b][i]);
            if(--b < t) break;
            for(int i = b; i >= t; i--)     // 从下向上
                ans.push_back(matrix[i][l]);
            if(++l > r) break;
        }
        return ans;
    }
};
void printVector(vector<int> &res) {
    cout << "[";
    for(int i = 0; i < res.size(); i++) {
        cout << res[i];
        if(i < res.size() - 1)
            cout << ",";
    }
    cout << "]"<<endl;
}
int main() {
    vector<vector<int>> matrix1({{1,2,3},{4,5,6},{7,8,9}});
    vector<int> res1= Solution().spiralOrder(matrix1);
    printVector(res1);

    vector<vector<int>> matrix2({{1,2,3,4},{5,6,7,8},{9,10,11,12}});
    vector<int> res2= Solution().spiralOrder(matrix2);
    printVector(res2);
    return 0;
}
